<?php

declare(strict_types=1);
/**
 * This file is part of habo_new_media.
 *
 * @link     https://www.berlen.cn/
 * @contact  tech@berlen.cn
 * @license  http://gitlab.rehou.cn/habo/habo_new_media/-/blob/master/README.md
 */
namespace app\command\ocean;

use app\command\BaseWork;
use app\enum\OeInvalidVideoEnum;
use app\model\OeInvalidVideoSetupModel;
use app\service\ocean\VideoService;
use think\console\Input;
use think\console\Output;
use think\facade\Cache;

class InvalidVideoWork extends BaseWork
{
    public const MONTH_GET_DATA_KEY = 'oe:invalid:video:';

    protected function configure()
    {
        // 指令配置
        $this->setName('oe_invalid_video_work');
        // 设置参数
        $this->setDescription('拉取巨量无效素材列表，20~31号每天执行一次');
        // 设置是否测试表示
        $this->addArgument('is_test', null, '是否测试，传值即为测试')->setHelp('php think oe_invalid_video_work [1]');
    }

    protected function execute(Input $input, Output $output)
    {
        set_time_limit(0);
        ini_set('memory_limit', '-1');
        $this->getOutputMessage('拉取巨量无效素材开始');
        $redis = Cache::store('redis')->handler();
        $runTime = time() + 5 * 60;
        $nowTest = intval($input->getArgument('is_test')) === 1;
        $thisMonth = date('Ym');

        while (time() < $runTime) {
            // 获取判定标准
            $results = (new OeInvalidVideoSetupModel())->field(true)->select();
            foreach ($results as $result) {
                if (! $result instanceof OeInvalidVideoSetupModel || ! $result->getKey()) {
                    continue;
                }
                $this->getOutputMessage('拉取代理商[' . $result->getAttr('agent_id') . ']巨量无效素材开始');
                $runDate = $result->getAttr('run_date');
                $runDate = json_decode($runDate, true);
                if (! is_array($runDate)) {
                    $this->getOutputMessage('代理商[' . $result->getAttr('agent_id') . ']无效素材关停标准日期设置有误');
                    continue;
                }

                // 判断执行标准里的日期设置
                $date = date('j');
                $days = date('t');
                if (! $nowTest && ! ($date == 20 && in_array(OeInvalidVideoEnum::RUN_TYPE_20, $runDate) || $date == 25 && in_array(OeInvalidVideoEnum::RUN_TYPE_25, $runDate) || $date === ($days - 1) && in_array(OeInvalidVideoEnum::RUN_TYPE_LAST_TWO_DATE, $runDate) || $date === $days && in_array(OeInvalidVideoEnum::RUN_TYPE_LAST_DATE, $runDate))) {
                    $this->getOutputMessage('非代理商[' . $result->getAttr('agent_id') . ']拉取无效素材执行日期');
                    continue;
                }

                $taskKey = self::MONTH_GET_DATA_KEY . $thisMonth . ':' . $result->getAttr('agent_id');
                // 判断是否有同代理商同月份的执行任务
                if ($redis->exists($taskKey)) {
                    $this->getOutputMessage('代理商[' . $result->getAttr('agent_id') . '][' . $thisMonth . ']拉取无效素材任务执行中');
                    continue;
                }
                $redis->set($taskKey, 1);
                $redis->expire($taskKey, 600);

                // 无效素材拉取参数
                $filtering = [
                    'is_valid_video_material' => 2,
                    'material_is_effective' => $result->getAttr('latest_day_status') == 1 ? OeInvalidVideoEnum::MATERIAL_IS_EFFECTIVE : OeInvalidVideoEnum::MATERIAL_IS_NOT_EFFECTIVE,
                ];
                // N天之前创建的素材
                if (! empty($result->getAttr('create_time_than'))) {
                    $filtering['material_create_end_date'] = date('Y-m-d', strtotime('-' . $result->getAttr('create_time_than') . ' days'));
                }
                // 消耗筛选
                if (! empty($result->getAttr('total_cost'))) {
                    $filtering['policy_cost_max'] = intval($result->getAttr('total_cost'));
                }

                // 拉取数据
                $res = VideoService::getInvalidVideo($result->getAttr('agent_id'), date('Y-m'), $filtering);
                if (! $res) {
                    $this->getOutputMessage('拉取代理商[' . $result->getAttr('agent_id') . ']无效素材失败：' . VideoService::getError(0));
                }
                // 成功或失败后都清除任务执行标识
                $redis->del($taskKey);
            }
        }
        $this->getOutputMessage('拉取巨量无效素材结束');
    }
}
